home *** CD-ROM | disk | FTP | other *** search
/ Fritz: All Fritz / All Fritz.zip / All Fritz / FILES / WORDMISC / MICROSPL.LZH / CDICT.C next >
Text File  |  1987-10-20  |  5KB  |  245 lines

  1. /*    CDICT:    Compress Dictionary utility program for
  2.         MicroSPELL 1.01
  3.  
  4.         (C)opyright May 1987 by Daniel Lawrence
  5.         All Rights Reserved
  6. */
  7. #define        maindef        1
  8. #include    <stdio.h>
  9. #include    "dstruct.h"
  10. #include    "dopt.h"
  11. #include    "ddef.h"
  12. #include    "dsfx.h"
  13.  
  14. /* globals */
  15.  
  16. char mdfile[NSTRING];        /* main dictionary text file name */
  17. char mcfile[NSTRING];        /* compressed dictionary file name */
  18. /*FILE *mdptr = NULL;        /* main dictionary file pointer */
  19. FILE *mcptr = NULL;        /* compressed dictionary file pointer */
  20. int sflen[NSUFFIX];        /* length of suffixes */
  21.  
  22. main(argc, argv)
  23.  
  24. int argc;    /* # of command line arguments */
  25. char **argv;    /* text of command line arguments */
  26.  
  27. {
  28.     register char *word;        /* current word */
  29.     register int suffix;        /* suffix index */
  30.     char lastword[NSTRING];        /* previous word in dictionary */
  31.     char tempword[NSTRING];        /* temporary word in dictionary */
  32.     char *nxtmword();
  33.  
  34.     printf("CDICT Dictionary Compression Utility for MicroSPELL v1.00\n");
  35.  
  36.     if (argc != 3) {
  37.         help();
  38.         exit(EXBADOPT);
  39.     }
  40.  
  41.     strcpy(mdfile, argv[1]);
  42.     strcpy(mcfile, argv[2]);
  43.  
  44.     if (mopen() != TRUE) {
  45.         printf("%%Can not open text dictionary file\n");
  46.         exit(EXMDICT);
  47.     }
  48.  
  49.     /* open the output compressed dictionary file */
  50.     mcptr = fopen(mcfile, "w");
  51.     if (mcptr == NULL) {
  52.         printf("%%Can not open compressed dictionary output file\n");
  53.         exit(EXMDICT);
  54.     }
  55.  
  56.     /* prepare the suffix length table */
  57.     for (suffix = 0; suffix < NSUFFIX; suffix++)
  58.         sflen[suffix] = strlen(sfx[suffix]);
  59.  
  60.     printf("[Compressing %s => %s]\n", mdfile, mcfile);
  61.     lastword[0] = 0;    /* null last word */
  62.  
  63.     /* scan the dictionary, compressing */
  64.     word = nxtmword();
  65.     while (word) {
  66.         strcpy(tempword, word);
  67.         cmpsword(lastword, word);
  68.         strcpy(lastword, tempword);
  69.         word = nxtmword();
  70.     }
  71.  
  72.     /* close things up */
  73.     mclose();
  74.     fclose(mcptr);
  75.     printf("[Dictionary Compressed]\n");
  76. }
  77.  
  78. help()        /* tell us about cdict... */
  79.  
  80. {
  81.     printf("\nUsage:\n\n");
  82.     printf("    CDICT <text dictionary> <compressed dictionary>\n");
  83. }
  84.  
  85. mopen()        /* open the main dicionary */
  86.  
  87. {
  88.     /* if it is already open, close it down */
  89.     if (mdptr != NULL)
  90.         fclose(mdptr);
  91.  
  92.     /* open up the text dictionary... */
  93.     if ((mdptr = fopen(mdfile, "r")) == NULL)
  94.         return(FALSE);
  95.  
  96.     return(TRUE);
  97. }
  98.  
  99. mclose()    /* close the dictionary down */
  100.  
  101. {
  102.     /* if it is already open, close it down */
  103.     if (mdptr != NULL)
  104.         fclose(mdptr);
  105.     mdptr = NULL;
  106. }
  107.  
  108. char *nxtmword()    /* get the next word from the main dictionary */
  109.  
  110. {
  111.     static char word[NSTRING];    /* word to return */
  112.     char *fgets();
  113.  
  114.     /* is it already closed? */
  115.     if (mdptr == NULL)
  116.         return(NULL);
  117.  
  118.     /* get the next word */
  119.     if (fgets(word, NSTRING - 1, mdptr) == NULL) {
  120.         /* no more left!!!! close out */
  121.         fclose(mdptr);
  122.         mdptr = NULL;
  123.         return(NULL);
  124.     }
  125.  
  126.     /* all's well, dump the return, any trailing spaces and
  127.        return the word */
  128.     do
  129.         word[strlen(word) - 1] = 0;
  130.     while (word[strlen(word) - 1] == ' ');
  131.     return(word);
  132. }
  133.  
  134. cmpsword(lastword, word)    /* compress the given word */
  135.  
  136. char *lastword;        /* previous dictionary word */
  137. char *word;        /* current dictionary word */
  138.  
  139. {
  140.     register int index;    /* index into current word */
  141.     register int same;    /* # of same characters */
  142.     register int suffix;    /* suffix code */
  143.     register int wlen;    /* length of current word */
  144.  
  145.     /* scan for common suffixes */
  146.     wlen = strlen(word);
  147.     for (suffix = 0; suffix < NSUFFIX; suffix++) {
  148.         if (wlen < sflen[suffix])
  149.             continue;
  150.         if (strcmp(&word[wlen - sflen[suffix]], sfx[suffix]) == 0) {
  151.             word[wlen - sflen[suffix]] = 0;    /* trunc it */
  152.             break;
  153.         }
  154.     }
  155.  
  156.     /* If there is no suffix...suffix ends up as NSUFFIX */
  157.  
  158.     /* scan for like beginning characters */
  159.     index = 0;
  160.     while (lastword[index] && lastword[index] == word[index])
  161.         index++;
  162.  
  163.     same = index;
  164. #if    ASCII
  165.     suffix |= 128;
  166. #endif
  167.     fprintf(mcptr, "%c%s%c", 'A'+same, &word[index], suffix);
  168. }
  169.  
  170. #if    AZTEC & MSDOS
  171. #undef    fgetc
  172. #undef    fgets
  173. /*    a1gets:        Get an ascii string from a file using a1getc    */
  174.  
  175. char *a1gets(buffer, length, fp)
  176.  
  177. char *buffer;    /* buffer to leave string in */
  178. int length;    /* maximum length of string */
  179. FILE *fp;    /* file to get string from */
  180.  
  181. {
  182.     register int c;        /* current character read */
  183.     register char *bp;    /* pointer into buffer */
  184.  
  185.     bp = buffer;
  186.  
  187.     while ((c = a1getc(fp))    != EOF) {
  188.         *bp++ = (char)c;
  189.         if (c == '\n')
  190.             break;
  191.     }
  192.  
  193.     *bp = 0;
  194.     if (c == EOF)
  195.         return(NULL);
  196.     else
  197.         return(buffer);
  198. }
  199.  
  200. /*    a1getc:        Get an ascii char from the file input stream
  201.             but DO NOT strip the high bit
  202. */
  203.  
  204. int a1getc(fp)
  205.  
  206. FILE *fp;
  207.  
  208. {
  209.     int c;        /* translated character */
  210.  
  211.     c = getc(fp);    /* get the character */
  212.  
  213.     /* if its a <LF> char, throw it out  */
  214.     while (c == 10)
  215.         c = getc(fp);
  216.  
  217.     /* if its a <RETURN> char, change it to a LF */
  218.     if (c == '\r')
  219.         c = '\n';
  220.  
  221.     /* if its a ^Z, its an EOF */
  222.     if (c == 26)
  223.         c = EOF;
  224.  
  225.     return(c);
  226. }
  227. #endif
  228.  
  229. #if    CMS
  230. #undef    fopen
  231. /*    The IBM 30xx likes to tell us when file opens
  232.     fail...it's too chatty....I like to handle these myself    */
  233.  
  234. FILE *cmsopen(file, mode)
  235.  
  236. char *file;    /* name of file to open */
  237. char *mode;    /* mode to open it in */
  238.  
  239. {
  240.     quiet(1);
  241.     return(fopen(file,mode));
  242. }
  243. #endif
  244.  
  245.